package com.zs.letcode.tencent;

/**
 * 2的幂
 * 给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
 * <p>
 * 如果存在一个整数 x 使得n == 2x ，则认为 n 是 2 的幂次方。
 * <p>
 * 示例 1：
 * <p>
 * 输入：n = 1
 * 输出：true
 * 解释：20 = 1
 * 示例 2：
 * <p>
 * 输入：n = 16
 * 输出：true
 * 解释：24 = 16
 * 示例 3：
 * <p>
 * 输入：n = 3
 * 输出：false
 * 示例 4：
 * <p>
 * 输入：n = 4
 * 输出：true
 * 示例 5：
 * <p>
 * 输入：n = 5
 * 输出：false
 * 提示：
 * <p>
 * -231 <= n <= 231 - 1
 * 
 * <p>
 * 进阶：你能够不使用循环/递归解决此问题吗？
 * <p>
 * 相关标签
 * 位运算
 * 递归
 * 数学
 * <p>
 * 作者：力扣 (LeetCode)
 * 链接：https://leetcode-cn.com/leetbook/read/tencent/x5yjhd/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 *
 * @author madison
 * @description
 * @date 2021/7/19 08:31
 */
public class Chapter32 {
    public static void main(String[] args) {

    }

    private static class Solution {
        /**
         * 方法一：二进制表示
         *
         * @param n
         * @return
         */
        public boolean isPowerOfTwo(int n) {
            return n > 0 && (n & (n - 1)) == 0;
        }

        public boolean isPowerOfTwo1(int n) {
            return n > 0 && (n & -n) == n;
        }

        /**
         * 方法二：判断是否为最大 22 的幂的约数
         */
        public boolean isPowerOfTwo2(int n) {
            int BIG = 1 << 30;
            return n > 0 && BIG % n == 0;
        }
    }
}
